package com.shejimoshi.模板方法模式;

/**
 * 模板方法模式：定义一个操作中算法的框架，而将一些步骤延迟到子类中。
 * 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
 * 模板方法模式是一种基于继承的代码复用技术，它是一种类行为型模式。
 *
 * 抽象类:其中的 makeCourse 方法是模板方法，它定义了制作网课的基本流程，
 * makePPT、makeVideo、writeArticle 这三个步骤在所有课程中都是固定的，
 * 所以用 final 关键字修饰；packageCourse 方法在所有课程中都可能不一样，
 * 所以声明为抽象方法，由子类自行实现；
 * 钩子方法 needWriteArticle 返回一个 boolean 类型的值，控制是否编写课程笔记
 */
public abstract class ACourse {

    protected final void makeCourse() {
        this.makePPT();
        this.makeVideo();
        if (needWriteArticle()) {
            this.writeArticle();
        }
        this.packageCourse();
    }

    final void makePPT() {
        System.out.println("1. 制作PPT");
    }

    final void makeVideo() {
        System.out.println("2. 制作视频");
    }

    final void writeArticle() {
        System.out.println("3. 编写课程笔记");
    }

    //钩子方法
    protected boolean needWriteArticle() {
        return false;
    }

    // 提供课程资料:每个课程都不同（有些课程需要提供源代码，有些需要提供图片文件等）
    abstract void packageCourse();
}
